<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
</body>
</html>

<script>
const { log } = console;

// 闭包是什么：
// 外部函数体内声明一个内部函数，内部函数中引用外部函数的变量；即形成闭包。

// 闭包 + 内存回收机制：
// 若内部函数的声明，被外部函数 return 出去，return 值被全局变量引用，则内部函数不会被销毁
  // 即，内部函数中 引用外部函数的变量，也不会被销毁。

// ------------------------------
// 思考下面代码的执行顺序，和 内存释放顺序：
  // inner 函数执行完，其函数体内的内存空闲先被释放，然后 释放 out 函数体的内存空间。
  // 总结：若函数 套函数，其内存释放的逻辑是：先释放内部函数，再释放外部函数。
    // 本质都是在 栈中执行 嵌套函数。
function out() {
  const i = 0;
  function inner() {
    console.log(i);
  }
  inner();
}

out();

// 用栈表示 out() 的执行： stack = []
  // 1. 执行out函数： -> stack.push(out)
  // 2. 执行 inner函数： ->  stack.push(inner)
  // 3. inner 函数被执行完毕  ->  stack.pop();  -> inner函数相关内存内释放
  // 4. out 函数被执行完毕  ->  stack.pop();  -> out函数相关内存内释放
    // 整体执行完毕，栈被清空


// 从数据结构来讲：函数的执行，其实都是放到 栈 (数据结构)中执行的。
  // 数据结构中 - 「栈」的特性：先进后出
  // 数据结构中 - 「队列」的特性：先进先出
    // 数据结构还有：树、栈、队列、链表...
      // 即，数据以什么样的形态去表示，即为「数据结构」。

</script>
